/*
 * LogCacheFile.c
 *
 *  Created on: 02/11/2011
 *      Author: utn_so
 */

#include "LogCacheFile.h"
#include "ManageCacheFile.h"

/********Sub Funciones*********************/
FILE* openFileLogCacheData();
void closeFileLogCacheData(FILE*);
void obtenerCabezera(cacheData[], char[], char[]);


/* itoa:  convert n to characters in s */
void itoa(int32_t n, char s[]);

/* reverse:  reverse string s in place */
 void reverse(char s[]);


/***********Funcion Principal*************/

void escribirLogCacheFile()
{
	FILE* logfile = openFileLogCacheData();
	cacheFile* aux = cacheList;

		while (aux != NULL) {
			char cabezera[150];
			cacheData* bloques = aux->dataVector;

			obtenerCabezera(bloques, cabezera, aux->nameOfFile);
			fprintf(logfile, "%s", cabezera);

			if (bloques != NULL) {
				uint32_t i = 0;
				while((i < sizeOfCacheData) && (bloques[i].idBloque != -1)){
					char* contenido = (char*)(malloc(100));
					strcpy(contenido,"\nContenido de Bloque de Cache: ");
					char tb[10];
					itoa(i,tb);
					strcat(contenido, tb);
					strcat(contenido, "\n\n");

					fprintf(logfile, "%s", contenido);
					int j;

					// impresion contenido de la cache
					/*for(j = 0;j < 4096; j++){
						printf("%02x ", bloques[i].file[j]);
					}
					printf("\n");*/

					//	pasaje al archivo
					for(j = 0;j < 4096; j++){

						if(bloques[i].bloque[j] == 0x00)
							fputc(0xff, logfile);

						else
							fputc(bloques[i].bloque[j], logfile);
					}


					fprintf(logfile, "%s", "\n");
					i++;
					free(contenido);
				}
			}
			aux = aux->sig;
			fprintf(logfile, "%s", ENDOFCACHEDATA);
		}

		//closeFileLogCacheData(logfile);
		fclose(logfile);

}

void obtenerCabezera(cacheData bloques[], char* cabezera, char* nameOfFile){
	strcpy(cabezera,"Timestamp: ");
	time_t tiempo = time(0);
	struct tm *tlocal = localtime(&tiempo);
	char timestamp[128];
	strftime(timestamp, 128, "%Y.%m.%d %H:%M:%S", tlocal);

	strcat(timestamp, "\n");
	strcat(cabezera, timestamp);
	strcat(cabezera, "Archivo: /");
	char* archivo;
	archivo = obtenerNombreDelArchivo(nameOfFile);
	strcat(cabezera, archivo);
	strcat(cabezera, "\n");
	strcat(cabezera, "Tamanio de Bloque de Cache: 4kb\n");
	strcat(cabezera, "Cantidad de Bloques de Cache: ");

	char cb[10];
	itoa(sizeOfCacheData,cb);
	strcat(cabezera, cb);
	strcat(cabezera, "\n\n");
}

FILE* openFileLogCacheData(){
	FILE* logfile;
		if ((logfile = fopen(LOGCACHE, "at")) == NULL)
		{
			if ((logfile = fopen(LOGCACHE, "wt")) == NULL)
			{
				printf("Error al abrir archivo log (abrir_logfile())\n");
				//return -1;
			}
		}
		return logfile;
}

void closeFileLogCacheData(FILE* logfile){
	if (fclose(logfile) != 0) {
			printf("Error cerrando logCahe.log\n");
		}
}

char* obtenerNombreDelArchivo(char* path){
	char* pathAux = malloc (sizeof(char)*30);
		char* pathSinArchivo = malloc (sizeof(char)*30);
		char* pathAuxAnt;
		char* pathAuxAnt2;
		char* nombreArchivo;

		strcpy(pathSinArchivo,"NoHayPATH");
		strcpy(pathAux, path);

		char tokens[2] = "/";
		pathAuxAnt = strtok(pathAux, tokens);
		pathAuxAnt2 = pathAuxAnt;

		while(pathAuxAnt != NULL)
			{
			nombreArchivo = pathAuxAnt;
			pathAuxAnt = strtok(NULL, tokens);

			if(pathAuxAnt!=NULL)
				{
				if(strcmp(pathSinArchivo,"NoHayPATH") == 0)
					strcpy(pathSinArchivo,pathAuxAnt2);
				else
					strcat(pathSinArchivo,pathAuxAnt2);
				strcat(pathSinArchivo, "/");
				pathAuxAnt2 = pathAuxAnt;
				}
			}

		if(strcmp(pathSinArchivo,"NoHayPATH") == 0)
			strcpy(pathSinArchivo, "./");

		return nombreArchivo;
}


/* itoa:  convert n to characters in s */
void itoa(int32_t n, char s[])
{
	 int32_t i, sign;

     if ((sign = n) < 0)  /* record sign */
         n = -n;          /* make n positive */
     i = 0;
     do {       /* generate digits in reverse order */
         s[i++] = n % 10 + '0';   /* get next digit */
     } while ((n /= 10) > 0);     /* delete it */
     if (sign < 0)
         s[i++] = '-';
     s[i] = '\0';
     reverse(s);
}

/* reverse:  reverse string s in place */
 void reverse(char s[])
{
     int32_t i, j;
     char c;

     for (i = 0, j = strlen(s)-1; i<j; i++, j--) {
         c = s[i];
         s[i] = s[j];
         s[j] = c;
     }
}



